package speed2010.middleware.comunicacao;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.net.Socket;
import java.util.Vector;

import speed2010.mensagem.Mensagem;
import speed2010.mensagem.TipoDaFila;
import speed2010.middleware.Serializer;
import speed2010.middleware.serviceOverlay.node.Node;

public class SocketServerConnection implements Runnable {
	private Socket server;
	private String input;
	private Node parentNode = null;

	public SocketServerConnection(Socket server, Node parentNode) {
		this.parentNode = parentNode;
		this.server = server;
	}

	synchronized public void run() {
		input = "";

		try {
			// Get input from the client
			ObjectInputStream in = new ObjectInputStream(server
					.getInputStream());
			boolean comSeguranca = false;
			while (true) {
				byte[] arrayDeBytes = (byte[]) in.readObject();
//				long t = System.currentTimeMillis();
				input = (String) Serializer.unserialize(arrayDeBytes);
//				long t1 = System.currentTimeMillis();
//				System.out.println("Tempo para desserializar a msg: #"
//						+ (t1 - t) + "# ms.");
				if (this.parentNode.getGuiConsulta() != null
						&& this.parentNode.getGuiConsulta()
								.getJCheckBoxComSeguranca().isSelected()) {
					comSeguranca = true;
				} else {
					comSeguranca = false;
				}

				Mensagem msg = Serializer.convertToMensagem(input,
						comSeguranca, parentNode);
				
				//////// Adicionado em 24/07/11
				
				if(msg.getQntObjetosTransmissao() > 0){
					if(msg.getObjetos() == null){
						msg.setObjetos(new Vector<Object>());
					}
					
					for (int i = 0; i < msg.getQntObjetosTransmissao(); i++){
						arrayDeBytes = (byte[]) in.readObject();
						msg.getObjetos().add(Serializer.unserialize(arrayDeBytes));	
					}
					
					
				}
				
//				long t2 = System.currentTimeMillis();
//				System.out.println("Tempo para converter a string em msg: #"
//						+ (t2 - t1) + "# ms.\n");
				msg.setTipoDaFila(TipoDaFila.ENTRADA);
				this.parentNode.getMsgQueue().adicionaMsg(msg);
				// System.out.println("Receive message is:" + input);
			}
		} catch (IOException ioe) {
			System.out.println("IOException on socket listen: " + ioe);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				server.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}
